
/**
 * 防抖: 指定时间间隔内只会执行一次任务，并且该时间段内再触发，都会重新计算时间。(函数防抖的非立即执行版)
 * 在频繁触发某些事件，导致大量的计算或者非常消耗资源的操作的时候，防抖可以强制在一段连续的时间内只执行一次
 * */
export function debounce (fn, delay, config) {
  const _delay = delay || 200
  config = config || {}
  // const _this = this // 该this指向common.js
  // console.log('debounce', this, config.eventType, arguments)
  return function () {
    const th = this // 该this指向实例
    const args = arguments
    // debounceNum++
    // let str = `, label: ${ th && th.listItem && th.listItem.label } `
    // console.log('debounce++', ', debounceNum:', debounceNum, ', timer: ', fn.timer, str, config.eventType)
    if (fn.timer) {
      // console.log('debounce-clearTime', ', debounceNum:', debounceNum, ', timer: ', fn.timer, config.eventType)
      clearTimeout(fn.timer)
      fn.timer = null
    } else {
      // fn.debounceNum = debounceNum
    }
    fn.timer = setTimeout(function () {
      // str = `, label: ${ th && th.listItem && th.listItem.label } `
      // console.log('debounce-setTimeout', ', debounceNum:', fn.debounceNum, ', timer: ', fn.timer, str, config.eventType)
      fn.timer = null
      fn.apply(th, args)
    }, _delay)
  }
}

/**
 * 节流函数: 指定时间间隔内只会执行一次任务，在该时间内，不管后面多少触发，都只执行一次。
 * @param {function} fn
 * @param {Number} interval
 */
export function throttle (fn, interval = 300) {
  let canRun = true
  // console.log('节流-throttle-1')
  return function () {
    // console.log('节流-throttle-2')
    if (!canRun) return
    canRun = false
    setTimeout(() => {
      // console.log('节流-throttle-3')
      fn.apply(this, arguments)
      canRun = true
    }, interval)
  }
}
